package com.qf.day7;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * @date 2022/4/7
 * @desc
 */
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        DiskFileItemFactory factory = new DiskFileItemFactory();

        //  上传文件的解析组件
        ServletFileUpload upload = new ServletFileUpload(factory);

        if(!upload.isMultipartContent(req)){
            //  进到这个if 说明 是 一般的表单  数据按照一般的方式来接受
            String userName = req.getParameter("userName");
            System.out.println(userName);

            return;
        }

        try {
            // list 放的是 表单的数据项
            List<FileItem> list = upload.parseRequest(req);

            for(FileItem item:list){
                // 遍历 表单的每一个数据项  判断 是普通的数据项 还是 上传的数据项
                if(item.isFormField()){
                    // 是普通的表单数据项
                    String name = item.getFieldName();
                    String value = item.getString("utf-8");  //  解决普通表单字段的中文乱码
                    //value= new String(value.getBytes("iso-8859-1"),"utf-8");
                    //System.out.println(name);
                    //System.out.println(value);
                }else{
                    // 处理上传的表单项
                    String fileName = item.getName();  // 得到上传文件的名字
                    //  不同的浏览器得到的文件名字是不一样的  火狐和360  只得到文件的名字  ie  会得到路径和名字
                    System.out.println(fileName);

                    //  如果没有选择文件 则fileName  的值 为 ""  应该跳过该item的处理
                    if(fileName==null||fileName.trim().equals("")){
                        continue;
                    }

                    // 排除浏览器的差异 导致的文件名不一样的情况
                    fileName = fileName.substring(fileName.lastIndexOf("\\")+1);

                    //上传的数据 在 item 对象封装了
                    InputStream in = item.getInputStream();

                    String bucketname="qf2106";
                    // yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
                    String endpoint = "oss-cn-beijing.aliyuncs.com";
// 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
                    String accessKeyId = "LTAI5tJ855h5WYvmTKD1X7Sz";
                    String accessKeySecret = "eWdOIuho68VYcImhT9zdNC4Fhv0XwZ";

// 创建OSSClient实例。
                    OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

                    // 填写Bucket名称和Object完整路径。Object完整路径中不能包含Bucket名称。
                    ossClient.putObject("qf2106", "2201/"+fileName, in);

// 关闭OSSClient。
                    ossClient.shutdown();

                    in.close();

                    System.out.println("https://qf2106.oss-cn-beijing.aliyuncs.com/2201/"+fileName);
                }
            }

        } catch (FileUploadException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}
